const COS = require('cos-nodejs-sdk-v5')
const fs = require('fs')
const { ValidationError } = require('./customError')
require('dotenv').config()
const cos = new COS({
  SecretId: process.env.COS_SECRET_ID,
  SecretKey: process.env.COS_SECRET_KEY,
})

/**
 * Cos 上传文件
 * @param file 上传的文件
 * @param type 文件所属类型[头像/分类图片/标签图片]
 * @returns {Promise<{code: number, data: string, key: string}|{code: number, message}>}
 * @constructor
 */
async function CosUploadFile(file, type) {
  if (!file) {
    return {
      code: 422,
      message: '缺少上传文件参数',
    }
  }
  if (!type) {
    return {
      code: 422,
      message: '缺少上传文件类型参数',
    }
  }
  const key = `private/${type}/${Date.now()}_${file.originalFilename}`
  try {
    // 上传到私有存储桶
    await cos.putObject({
      Bucket: process.env.COS_BUCKET,
      Region: process.env.COS_REGION,
      Key: key,
      Body: fs.createReadStream(file.filepath),
      // 读写模式
      ACL: 'default',
    })

    // 生成临时访问链接（有效期30分钟）
    const TempUrl = cos.getObjectUrl({
      Bucket: process.env.COS_BUCKET,
      Region: process.env.COS_REGION,
      Key: key,
      Expires: 1800, // 秒
      Sign: true,
    })
    // 原地址
    const url = `https://${process.env.COS_BUCKET}.cos.${process.env.COS_REGION}.myqcloud.com/${key}`
    return {
      code: 200,
      data: {
        url,
        TempUrl,
      },
      key: key,
    }
  } catch (e) {
    return {
      code: 500,
      message: e.message,
    }
  } finally {
    // 删除临时文件
    fs.unlinkSync(file.filepath)
  }
}

module.exports = { CosUploadFile, cos }
